package com.winsdom.mapper.customer;

import com.winsdom.entity.customer.CustomerIndividualUpdateRequest;
import org.apache.ibatis.annotations.MapKey;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

import java.util.Map;

/**
 * 个体工商户客户信息管理的数据访问接口，提供个体工商户客户信息查询、更新和删除操作。
 * 该接口包含了查询客户数据、更新客户信息、管理联系人及关联信息等相关方法。
 */
@Repository
public interface CustomerIndividualUpdateMapper {
    /**
     * 查询客户现有数据（包含地址和执照信息）
     * @param customerId 客户ID
     * @return 返回一个Map，包含客户主表、地址和执照等信息，以customerId为键
     */
    @MapKey("customerId")
    Map<String, Object> selectCustomerData(Long customerId);

    /**
     * 更新客户主表信息
     * @param request 个体工商户更新请求对象，包含需要更新的客户主表信息
     */
    void updateCustomerMain(CustomerIndividualUpdateRequest request);

    /**
     * 更新个体户扩展表信息
     * @param request 个体工商户更新请求对象，包含需要更新的个体户扩展表信息
     */
    void updateIndividualBusiness(CustomerIndividualUpdateRequest request);

    /**
     * 删除客户的旧联系人及关联信息
     * @param customerId 客户ID
     */
    void deleteOldContacts(Long customerId);

    /**
     * 插入新联系人信息
     * @param contact 联系人信息对象，包含新联系人的详细信息
     */
    void insertContact(@Param("contact") CustomerIndividualUpdateRequest.ContactInfo contact);

    /**
     * 插入联系人与楼盘分类的关联关系
     * @param contactId 联系人ID
     * @param categoryId 楼盘分类ID
     */
    void insertContactProperty(@Param("contactId") Long contactId, @Param("categoryId") Long categoryId);

    /**
     * 根据楼盘分类名称查询对应的分类ID
     * @param propertyName 楼盘分类名称
     * @return 对应的楼盘分类ID，如果不存在则返回null
     */
    Long selectCategoryIdByName(String propertyName);

    /**
     * 查询客户的联系人信息
     * @param customerId 客户ID
     * @return 返回一个Map，包含客户的联系人信息，以contactId为键
     */
    @MapKey("contactId")
    Map<String, Object> selectContactsByCustomerId(Long customerId);

    /**
     * 查询联系人关联的楼盘名称
     * @param contactId 联系人ID
     * @return 返回联系人关联的楼盘名称，多个楼盘名称以特定格式连接（如逗号分隔）
     */
    String selectContactProperties(Long contactId);

    /**
     * 强制更新经营地址信息（忽略可能的冲突）
     * @param request 个体工商户更新请求对象，包含需要更新的经营地址信息
     */
    void forceUpdateBusinessAddress(CustomerIndividualUpdateRequest request);

    /**
     * 强制更新营业执照信息（忽略可能的冲突）
     * @param request 个体工商户更新请求对象，包含需要更新的营业执照信息
     */
    void forceUpdateBusinessLicense(CustomerIndividualUpdateRequest request);
}